package top.frsf.mqtt.handler.strategy.abs;

import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.mqtt.*;

/**
 * MQTT协议事件 - 消息处理策略接口
 *
 * @author He Kuntao
 * @since 2025/5/29 14:13
 */
public interface MqttMessageHandlerStrategy {

    /**
     * 处理MQTT协议事件
     *
     * @param ctx     handler上下文
     * @param message MQTT消息
     */
    void handle(ChannelHandlerContext ctx, MqttMessage message);

    /**
     * 支持的MQTT协议事件类型
     *
     * @return MQTT协议事件类型
     */
    MqttMessageType supportedType();

    /**
     * 创建MQTT连接确认消息
     *
     * @return MQTT连接确认消息
     */
    default MqttConnAckMessage createConnAck() {
        return MqttMessageBuilders.connAck()
                .returnCode(MqttConnectReturnCode.CONNECTION_ACCEPTED)
                .sessionPresent(false)
                .build();
    }

    /**
     * 创建MQTT订阅确认消息
     *
     * @param messageId 消息ID
     * @return MQTT订阅确认消息
     */
    default MqttSubAckMessage createSubAck(int messageId) {
        return MqttMessageBuilders.subAck()
                .packetId(messageId)
                .addGrantedQos(MqttQoS.AT_MOST_ONCE)
                .build();
    }

    /**
     * 创建MQTT取消订阅确认消息
     *
     * @param messageId 消息ID
     * @return MQTT取消订阅确认消息
     */
    default MqttUnsubAckMessage createUnsubAck(int messageId) {
        return MqttMessageBuilders.unsubAck()
                .packetId(messageId)
                .build();
    }

}
